<?php
  /**
   *@author Evandro de Oliveira.
   * @category HELPER.
   * 
   * @since 09/09/2010.
   * 
   * @copyright 2009.
   * 
   * @version 1.0.
   */

  class Zend_View_Helper_Tag extends Zend_View_Helper_Abstract{
    // Definição de variáveis.
    private $tagOpen;
    
    private $tagClose;
    
    private $children;
    
    private $attributes;
    
    // Construtor.
    public function __construct($name){
      $this->tagOpen = "<$name";
      
      $this->tagClose = "</$name>";
    }
    
    // Método setAttribute - define um atributo para o elemento.
    public function setAttribute($attribute, $value){
      $value = htmlspecialchars($value, ENT_QUOTES);
      
      $this->attributes[] = " $attribute = '$value'";
    }
    
    // Método removeAttribute - recupera um atributo do elemento.
    public function removeAttribute($attribute){
      $start = strpos($this->tagOpen, $attribute);
      
      if($start){
        $end = $start + strlen($attribute) + 2;
        
        while(substr($this->tagOpen, $end, 1) != "'"){
          $end++;
        }
        
        $end++;
        
        $length = $end - $start;
      }
  
      $att = substr($this->tagOpen, $start, $length);
      
      $this->tagOpen = $this->tagOpen = str_replace($att, '', $this->tagOpen);
    }
    
    // Método add - adiciona um objeto ao elemento.
    function add($child){
      $this->children[] = $child;
    }
    
    // Método show - coloca o elemento na tela.
    function show(){
      //Define a tag de abertura
      $tag = $this->tagOpen;
      
      //Insere os atributos na tag
      for($i = 0; $i < count($this->attributes); $i++){
        $tag .= $this->attributes[$i];
      }
        
      //Fecha a tag de abertura
      $tag .= ">";
  
      //Imprime a tag de abertura
      echo $tag;
  
      for($i = 0; $i < count($this->children); $i++){
        if(is_object($this->children[$i])){
          $this->children[$i]->show();
        }
        else{
          echo $this->children[$i];
        }
      }
  
      //Imprime a tag de fechamento
      echo  $this->tagClose;
      echo "\n";
    }
    
    function getElement(){
      //Define a tag de abertura
      $tag = $this->tagOpen;
  
      //Insere os atributos na tag
      for($i = 0; $i < count($this->attributes); $i++){
        $tag .= $this->attributes[$i];
      }
  
      //Fecha a tag de abertura
      $tag .= ">";
  
      //Adiciona e imprime o conteÃºdo da tag
      for($i = 0; $i < count($this->children); $i++){
        if(is_object($this->children[$i])){
          $tag .= $this->children[$i]->getElement();
        }
        else{
          $tag .= $this->children[$i];
        }
      }
  
      //Retorna a tag
      $tag .= $this->tagClose;
      
      return htmlspecialchars($tag, ENT_QUOTES);
    }
  }
?>